﻿using System;
using System.IO;
using System.Data;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using Recomendaciones.Entidades;
using Recomendaciones.AccesoADatos;

//Agregado 1-12. Se agregaró la biblioteca IO, la funcion MovePhoto, las constantes que están unos renglones abajo y se modificó el actualizar e insertar.

/// <summary>
/// Descripción breve de LibroServices
/// </summary>
public class LibroServices
{
    Ado _ado;
    private const string _photoDirectory = @"\Imagenes\Libros\";
    private const string _photoDirectoryTemp = @"\Imagenes\temp\";
    private const string _defaultPhoto = @"Libro-default.jpg";

    #region Constructor y Destructor
    public LibroServices()
    {
        _ado = new Ado();
    }

    ~LibroServices()
    {
        _ado = null;
    }
    #endregion

    private string MovePhoto(string photo)
    {
        try
        {
            var sourceFilePath = AppDomain.CurrentDomain.BaseDirectory + _photoDirectoryTemp + Path.GetFileName(photo);
            var destFilePathShort = _photoDirectory + Path.GetFileName(photo);
            var count = 1;

            while (File.Exists(AppDomain.CurrentDomain.BaseDirectory + destFilePathShort))
            {
                destFilePathShort = _photoDirectory + Path.GetFileNameWithoutExtension(photo) + "(" + count++ + ")" + Path.GetExtension(photo);
            }
            File.Move(sourceFilePath, AppDomain.CurrentDomain.BaseDirectory + destFilePathShort);
            return destFilePathShort.Replace('\\', '/');
        }
        catch { return null; }
    }

    public List<Libro> ObtenerTopTen()
    {
        try
        {
            _ado.EjecutarStoredProcedureDataReader("Libro_ObtenerTopTen");
            DataTable libros = _ado.DevolverDatosRapido();
            return (List<Libro>)CollectionHelper.ConvertTo<Libro>(libros);
        }
        catch (Exception ex)
        {
            LogErrorServices logErrorService = new LogErrorServices();
            logErrorService.InsertarLogError(ex.GetType().ToString(), ex.StackTrace, ex.Message, ex.GetBaseException().ToString(), ex.Source);
            return null;
        }
    }

    public Libro ObtenerPorId(string id)
    {
        try
        {
            ArrayList parametros = new ArrayList(1);
            parametros.Add(Convert.ToInt32(id));
            _ado.EjecutarStoredProcedureDataReader("Libro_ObtenerPorId", parametros);
            DataTable libros = _ado.DevolverDatosRapido();

            //Solo devolvemos el primer elemento del list porque al buscar por id obtendremos un solo resultado//
            return ((List<Libro>)CollectionHelper.ConvertTo<Libro>(libros))[0];
        }
        catch (Exception ex)
        {
            LogErrorServices logErrorService = new LogErrorServices();
            logErrorService.InsertarLogError(ex.GetType().ToString(), ex.StackTrace, ex.Message, ex.GetBaseException().ToString(), ex.Source);
            return null;
        }
    }

    public List<GeneroLibro> ObtenerGeneros()
    {
        try
        {
            _ado.EjecutarStoredProcedureDataReader("Libro_ObtenerGeneros");
            DataTable generos = _ado.DevolverDatosRapido();

            return (List<GeneroLibro>)CollectionHelper.ConvertTo<GeneroLibro>(generos);
        }
        catch (Exception ex)
        {
            LogErrorServices logErrorService = new LogErrorServices();
            logErrorService.InsertarLogError(ex.GetType().ToString(), ex.StackTrace, ex.Message, ex.GetBaseException().ToString(), ex.Source);
            return null;
        }
    }

    public string InsertarLibro(string genero_id, string usuario_id, string titulo, string autores, string anio, string resumen, string idioma, string imagen, string isbn)
    {
        try
        {

            if (String.IsNullOrEmpty(titulo) || titulo.Length > 60 || !esAlfanumerico(titulo))
                return "Titulo invalido";
            if (String.IsNullOrEmpty(anio) || anio.Length != 4 || !esNumero(anio))
                return "Año invalido";
            if (String.IsNullOrEmpty(resumen) || resumen.Length > 1000 || !esAlfanumerico(resumen))
                return "Resumen invalido";
            if (String.IsNullOrEmpty(autores) || autores.Length > 60 || !esAlfanumerico(autores))
                return "Autores invalido";
            if (String.IsNullOrEmpty(isbn) || isbn.Length != 13 || !esNumero(isbn))
                return "Isbn invalido";
            if (String.IsNullOrEmpty(idioma) || idioma.Length > 20 || !esAlfanumerico(idioma))
                return "Idioma invalido";
            if (String.IsNullOrEmpty(genero_id) || !esNumero(genero_id))
                return "Genero invalido";
            if (String.IsNullOrEmpty(usuario_id) || !esNumero(usuario_id))
                return "Usuario invalido";

            string pathImagenTemp = Path.GetDirectoryName(imagen);
            if (pathImagenTemp + "\\" == _photoDirectoryTemp)
            {
                imagen = this.MovePhoto(imagen);
            }

            ArrayList parametros = new ArrayList(8);
            parametros.Add(Convert.ToInt32(genero_id));
            parametros.Add(Convert.ToInt32(usuario_id));
            parametros.Add(titulo);
            parametros.Add(autores);
            parametros.Add(Convert.ToInt32(anio));
            parametros.Add(resumen);
            parametros.Add(idioma);
            parametros.Add(imagen);
            parametros.Add(isbn);

            _ado.EjecutarStoredProcedureDataReader("Libro_Insertar", parametros);
            return _ado.DevolverRegistro();
        }
        catch (Exception ex)
        {
            LogErrorServices logErrorService = new LogErrorServices();
            logErrorService.InsertarLogError(ex.GetType().ToString(), ex.StackTrace, ex.Message, ex.GetBaseException().ToString(), ex.Source);
            return null;
        }
    }

    public string ActualizarLibro(string libro_id, string genero_id, string usuario_id, string titulo, string autores, string anio, string resumen, string idioma, string imagen, string isbn)
    {

        try
        {

            if (String.IsNullOrEmpty(titulo) || titulo.Length > 60 || !esAlfanumerico(titulo))
                return "Titulo invalido";
            if (String.IsNullOrEmpty(anio) || anio.Length != 4 || !esNumero(anio))
                return "Año invalido";
            if (String.IsNullOrEmpty(resumen) || resumen.Length > 1000 || !esAlfanumerico(resumen))
                return "Resumen invalido";
            if (String.IsNullOrEmpty(autores) || autores.Length > 60 || !esAlfanumerico(autores))
                return "Autores invalido";
            if (String.IsNullOrEmpty(isbn) || isbn.Length != 13 || !esNumero(isbn))
                return "Isbn invalido";
            if (String.IsNullOrEmpty(idioma) || idioma.Length > 20 || !esAlfanumerico(idioma))
                return "Idioma invalido";
            if (String.IsNullOrEmpty(genero_id) || !esNumero(genero_id))
                return "Genero invalido";
            if (String.IsNullOrEmpty(usuario_id) || !esNumero(usuario_id))
                return "Usuario invalido";
            if (String.IsNullOrEmpty(libro_id) || !esNumero(libro_id))
                return "Libro invalido";

            string pathImagenTemp = Path.GetDirectoryName(imagen);
            if (pathImagenTemp + "\\" == _photoDirectoryTemp)
            {
                imagen = this.MovePhoto(imagen);
            }

            ArrayList parametros = new ArrayList(10);
            parametros.Add(Convert.ToInt32(libro_id));
            parametros.Add(Convert.ToInt32(genero_id));
            parametros.Add(Convert.ToInt32(usuario_id));
            parametros.Add(titulo);
            parametros.Add(autores);
            parametros.Add(Convert.ToInt32(anio));
            parametros.Add(resumen);
            parametros.Add(idioma);
            parametros.Add(imagen);
            parametros.Add(isbn);

            _ado.EjecutarStoredProcedureDataReader("Libro_Actualizar", parametros);
            return _ado.DevolverRegistro();
        }
        catch (Exception ex)
        {
            LogErrorServices logErrorService = new LogErrorServices();
            logErrorService.InsertarLogError(ex.GetType().ToString(), ex.StackTrace, ex.Message, ex.GetBaseException().ToString(), ex.Source);
            return null;
        }
    }

    public string EliminarLibro(string id)
    {
        try
        {
            ArrayList parametros = new ArrayList(1);
            parametros.Add(Convert.ToInt32(id));
            _ado.EjecutarStoredProcedureDataReader("Libro_EliminarPorId", parametros);
            return _ado.DevolverRegistro();
        }
        catch (Exception ex)
        {
            LogErrorServices logErrorService = new LogErrorServices();
            logErrorService.InsertarLogError(ex.GetType().ToString(), ex.StackTrace, ex.Message, ex.GetBaseException().ToString(), ex.Source);
            return null;
        }
    }

    #region Validaciones

    private bool esAlfanumerico(string cadena)
    {
        System.Text.RegularExpressions.Regex regExobj = new System.Text.RegularExpressions.Regex("^[\\w.,: áéíóúÁÉÍÓÚñÑ]*$");
        return regExobj.IsMatch(cadena);
    }

    private bool esNumero(string cadena)
    {
        System.Text.RegularExpressions.Regex regExobj = new System.Text.RegularExpressions.Regex("^[0-9]*$");
        return regExobj.IsMatch(cadena);
    }

    #endregion
}
